#include <iostream>
#include <sys/socket.h>
#include <cstdlib>//exit(), EXIT_FAILURE/SUCCESS
#include <stdio.h>//fprintf, stderr
#include "sock.h"
#include "sockdist.h"

/*
*PROBLEMES/QUESTIONS PERSISTANT(E)S :
**Liberation memoire ?
**Comment connaitre la liste des machines connectees au serveur ?
*/


using namespace std;

int taille(char *c){
	int flag=0,i=0;

	while(c[i]!='\0'){
		flag++;
		i++;
	}
	return flag;
}


void serveur(char* hote){
	char tamponR[300], msg[300]="Ceci est un message automatique";
	int descbreLoc ;
	int envoi,retour;
	char *client;


	Sock brLoc(SOCK_DGRAM, (short)2000,0);
	if (brLoc.good()){
		descbreLoc=brLoc.getsDesc();
	}

	else {
		cout<<"Problème BR locale "<<endl;
		exit(EXIT_FAILURE);
	}
	
	SockDist dist;
	while((msg[3]!='t' || msg[2]!='i' || msg[1]!='x' || msg[0]!='e')&&(msg[0]!='q' || msg[1]!='u' || msg[2]!='i' || msg[3]!='t')){
		socklen_t len=dist.getsLen();
		sockaddr_in *adrsaB=dist.getAdrDist();

		cout<<endl;
		cout<<"En attente d'un message..."<<endl;
		retour=recvfrom(descbreLoc, tamponR, 300,0,(sockaddr *)adrsaB,&len);
		if (retour <0){
			fprintf(stderr,"Erreur lors du retour\n");
			exit(EXIT_FAILURE);
		}
		
		client = inet_ntoa(adrsaB->sin_addr);
		tamponR[retour]='\0';
		cout<<client<<" : "<<tamponR<<endl;
		

		cin.getline(msg,300);
		envoi=sendto(descbreLoc, msg, taille(msg), 0, (sockaddr *) adrsaB,dist.getsLen());
		if (envoi <0){
			fprintf(stderr,"Erreur lors de l'envoi\n");
			exit(EXIT_FAILURE);
		}
		
	}
	brLoc.~Sock();
	dist.~SockDist();
}

void client(char* hote){
	char tamponR[300], msg[300];
	int descbreLoc ;
	int envoi,retour;
	int alea=0;
	char *host;

	srand(time(NULL));
	alea=(rand()+1025)%64000;
	cout<<alea<<endl;

	Sock brLoc(SOCK_DGRAM, alea,0);
	if (brLoc.good()){
		descbreLoc=brLoc.getsDesc();
	}

	else {
		cout<<"Problème BR locale "<<endl;
		exit(EXIT_FAILURE);
	}
	
	SockDist dist(hote, 2000);
	while((msg[3]!='t' || msg[2]!='i' || msg[1]!='x' || msg[0]!='e')&&(msg[0]!='q' || msg[1]!='u' || msg[2]!='i' || msg[3]!='t')){
		sockaddr_in *adrsaB=dist.getAdrDist();
		envoi=sendto(descbreLoc, msg, taille(msg), 0, (sockaddr *) adrsaB,dist.getsLen());
		if (envoi <0){
			fprintf(stderr,"Erreur lors de l'envoi\n");
			exit(EXIT_FAILURE);
		}
		
		cout<<endl;
		cout<<"En attente d'un message..."<<endl;
		retour=recvfrom(descbreLoc, tamponR, 300,0,NULL,NULL);
		if (retour <0){
			fprintf(stderr,"Erreur lors du retour\n");
			exit(EXIT_FAILURE);
		}
		
		host=inet_ntoa(adrsaB->sin_addr);
		tamponR[retour]='\0';
		cout<<host<<" : "<<tamponR<<endl;
		cin.getline(msg,300);
	}
}

int main(int argc, char** argv){
	string rep1;
	char rep2[10];
	cout<<"client ou serveur ?"<<endl;
	cin>>rep1;

	if (rep1=="client"){
		cout<<"client"<<endl;
		cout<<"Sur quelle machine voulez-vous vous connecter?"<<endl;
		cin>>rep2;
		client(rep2);
	}
	else if (rep1=="serveur"){
		cout<<"serveur"<<endl;
		serveur(rep2);
	}
	else {
		fprintf(stderr,"Erreur \"client ou serveur ?\" : reponse incorrecte\n");
		return EXIT_FAILURE;
	}

	return 0;
}
